package com.basker.pisces.config;

import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.util.NumberUtils;

/**
 * 应用统一的获取属性配置的类，可以获取到{@link Environment}中的属性。
 *
 * @author hangwen
 */
public class ApplicationConfig {

    @Autowired
    private Environment environment;

    /**
     * 获取指定key对应的boolean值,key不存在返回null
     *
     * @param key
     * @return
     */
    public Boolean getBoolean(String key) {
        return this.getBoolean(key, null);
    }

    /**
     * 获取指定key对应的boolean值，如果key不存在则返回defaultVal
     *
     * @param key
     * @param defaultVal
     * @return
     */
    public Boolean getBoolean(String key, Boolean defaultVal) {
        String val = internalGet(key);
        if (val == null) {
            return defaultVal;
        } else {
            return BooleanUtils.toBooleanObject(val);
        }
    }

    /**
     * 获取指定key对应的浮点值,key不存在返回null
     *
     * @param key
     * @return
     */
    public Double getDouble(String key) {
        return this.getDouble(key, null);
    }

    /**
     * 获取指定key对应的浮点值，如果key不存在则返回defaultVal
     *
     * @param key
     * @param defaultVal
     * @return
     */
    public Double getDouble(String key, Double defaultVal) {
        String val = internalGet(key);
        if (val == null) {
            return defaultVal;
        } else {
            return NumberUtils.parseNumber(val, Double.class);
        }
    }

    /**
     * 获取指定key对应的整型值,key不存在返回null
     *
     * @param key
     * @return
     */
    public Integer getInteger(String key) {
        return this.getInteger(key, null);
    }

    /**
     * 获取指定key对应的整型值，如果key不存在则返回defaultVal
     *
     * @param key
     * @param defaultVal
     * @return
     */
    public Integer getInteger(String key, Integer defaultVal) {
        String val = internalGet(key);
        if (val == null) {
            return defaultVal;
        } else {
            return NumberUtils.parseNumber(val, Integer.class);
        }
    }

    /**
     * 获取指定key对应的string值,key不存在返回null
     *
     * @param key
     * @return
     */
    public String getString(String key) {
        return getString(key, null);
    }

    /**
     * 获取指定key对应的string值，如果key不存在则返回defaultVal
     *
     * @param key
     * @param defaultVal
     * @return
     */
    public String getString(String key, String defaultVal) {
        String val = internalGet(key);
        if (val == null) {
            return defaultVal;
        } else {
            return val;
        }
    }

    /**
     * 获取指定key对应的string值，并将其按","分割返回数组，如果key不存在则返回null
     *
     * @param key
     * @return
     */
    public String[] getStringArray(String key) {
        return getStringArray(key, ",", null);
    }

    /**
     * 获取指定key对应的string值，并将其按指定符号分割返回数组，如果key不存在则返回null
     *
     * @param key
     * @param split
     * @param defaultVal
     * @return
     */
    public String[] getStringArray(String key, String split) {
        return getStringArray(key, split, null);
    }

    /**
     * 获取指定key对应的string值，并将其按指定符号分割返回数组，如果key不存在则返回defaultVal
     *
     * @param key
     * @param split
     * @param defaultVal
     * @return
     */
    public String[] getStringArray(String key, String split, String[] defaultVal) {
        String val = internalGet(key);
        if (val == null) {
            return defaultVal;
        } else {
            return val.split(split);
        }
    }

    /**
     * 获取指定key对应的string值，并将其按","分割返回数组，如果key不存在则返回defaultVal
     *
     * @param key
     * @param defaultVal
     * @return
     */
    public String[] getStringArray(String key, String[] defaultVal) {
        return getStringArray(key, ",", defaultVal);
    }

    /**
     * 将text中的变量占位符替换成具体的变量值
     *
     * @param text
     * @return
     */
    public String resolvePlaceholders(String text) {
        return this.environment.resolvePlaceholders(text);
    }

    private String internalGet(String key) {
        return this.environment.getProperty(key);
    }

}
